﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entity;
using Business;

namespace CPEBookWeb
{
    public partial class Nouveau : System.Web.UI.Page
    {

        /// <summary>
        /// L'utilisateur loggé.
        /// </summary>
        private Utilisateur utilisateur;


        /// <summary>
        /// Appelée au chargement de la page.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            // On vérifie qu'un utilisateur est loggé
            utilisateur = (Utilisateur)Session["Utilisateur"];
            if (utilisateur == null)
            {
                Response.Redirect("Default.aspx");
            }

            // On renseigne la page avec les données en session
            lienBarreProfil.NavigateUrl = "Profil.aspx?id=" + utilisateur.idutilisateur;
            lienConsulterProfil.Text = utilisateur.prenom + " " + utilisateur.nom;
            lienConsulterProfil.NavigateUrl = "Profil.aspx?id=" + utilisateur.idutilisateur;
            lienModifierProfil.NavigateUrl = "Editer.aspx";

            labFilliere.Text = utilisateur.filliere;
            labPromo.Text = utilisateur.promotion.ToString();
            labPromo1.Text = utilisateur.promotion.ToString();

            // On affiche les résultats d'amis
            rafraichirResultats();
            rafraichirResultats2();
        }


        /// <summary>
        /// Methode permettant d'ajouter au panel des amis les demandes d'amis.
        /// </summary>
        private void rafraichirDemandes()
        {
            // On récupère le panel destiné à accueillir les demandes d'amis
            Panel panel = (Panel)Page.FindControl("panelDemandes");

            // On efface tout le contenu
            panel.Controls.Clear();

            // On récupère toutes les demandes d'ajouts à afficher
            List<AmitieUtilisateur> listDemandes = AmisService.getDemandeAjout(utilisateur.idutilisateur);

            if (listDemandes != null)
            {
                // On appele le composant générateur de code
                DemandesAjoutView demandeAjoutView = new DemandesAjoutView
                {
                    Demandes = listDemandes,
                    EcouteurDecision = new EventHandler(btnAccepterOuIgnorer_Click)
                };
                Panel tableDemandes = demandeAjoutView.getTableDemandes();

                // On ajoute la table
                panel.Controls.Add(tableDemandes);
            }
        }


        /// <summary>
        /// Methode permettant d'ajouter au panel des amis les demandes d'amis.
        /// </summary>
        private void rafraichirResultats()
        {
            // On récupère le panel destiné à accueillir les demandes d'amis
            Panel panel = (Panel)Page.FindControl("panelResultats");

            // On efface tout le contenu
            panel.Controls.Clear();

            // On récupère toutes les demandes d'ajouts à afficher
            List<Utilisateur> listResultats = UtilisateurService.rechercherUtilisateursParFilliereEtPromotion(utilisateur.filliere, (int)utilisateur.promotion);
            List<AmitieUtilisateur> listAmities = AmisService.getRelations(utilisateur.idutilisateur);

            // On l'enlève de sa liste
            listResultats.Remove(utilisateur);

            // On appele le composant générateur de code
            ResultatsView resultatsView = new ResultatsView
            {
                Utilisateur = utilisateur,
                Utilisateurs = listResultats,
                Amities = listAmities,
                EcouteurAction = new EventHandler(btnAction_Click),
                AfficherInfos = false
            };
            Table tableResultats = resultatsView.getTableResultats();

            // On ajoute la table
            panel.Controls.Add(tableResultats);
        }


        /// <summary>
        /// Methode permettant d'ajouter au panel des amis les demandes d'amis.
        /// </summary>
        private void rafraichirResultats2()
        {
            // On récupère le panel destiné à accueillir les demandes d'amis
            Panel panel = (Panel)Page.FindControl("panelResultats2");

            // On efface tout le contenu
            panel.Controls.Clear();

            // On récupère toutes les demandes d'ajouts à afficher
            List<Utilisateur> listResultats = UtilisateurService.rechercherUtilisateursParPromotion((int)utilisateur.promotion);
            List<AmitieUtilisateur> listAmities = AmisService.getRelations(utilisateur.idutilisateur);

            // On l'enlève de sa liste
            listResultats.Remove(utilisateur);

            // On enlève ceux de la recherche précédente
            List<Utilisateur> listFilliere = UtilisateurService.rechercherUtilisateursParFilliereEtPromotion(utilisateur.filliere, (int)utilisateur.promotion);
            listResultats.RemoveAll( delegate(Utilisateur u) {
                return listFilliere.Contains(u, new CompatateurUtilisateur());
            });

            // On appele le composant générateur de code
            ResultatsView resultatsView = new ResultatsView
            {
                Utilisateur = utilisateur,
                Utilisateurs = listResultats,
                Amities = listAmities,
                EcouteurAction = new EventHandler(btnAction_Click),
                AfficherInfos = true
            };
            Table tableResultats = resultatsView.getTableResultats();

            // On ajoute la table
            panel.Controls.Add(tableResultats);
        }


        /// <summary>
        /// Evenement appelé lors d'un clic sur "Ajouter" ou "Accepter".
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnAccepterOuIgnorer_Click(object sender, EventArgs e)
        {
            // On récupère le bouton à la source de l'évennement
            Button btnSource = (Button)sender;

            // On vérifie que la commande est valide
            if (btnSource.CommandName == "accepter" || btnSource.CommandName == "ignorer")
            {
                // On récupère l'identifiant
                int iddemandeur = -1;
                if (Int32.TryParse(btnSource.CommandArgument, out iddemandeur))
                {
                    // On traite en fonction de la réponse
                    if (btnSource.CommandName == "accepter")
                    {
                        AmisService.confirmerDemande(iddemandeur, utilisateur.idutilisateur);

                        // Après ajout on va sur la page du demandeur
                        Response.Redirect("Profil.aspx?id=" + iddemandeur.ToString());
                    }
                    else
                    {
                        AmisService.ignorerDemande(iddemandeur, utilisateur.idutilisateur);
                    }

                    // On met à jour la liste des demandes
                    rafraichirDemandes();
                }
            }
        }


        /// <summary>
        /// Evenement appelé lors d'un clic sur "Rechercher".
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void rechercheBouton_Click(object sender, EventArgs e)
        {
            Response.Redirect("Recherche.aspx?r=" + rechercheInput.Text);
        }


        /// <summary>
        /// Evenement appelé lors d'un clic sur un bouton d'action
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnAction_Click(object sender, EventArgs e)
        {
            // On récupère le bouton à la source de l'évennement
            Button btnSource = (Button)sender;

            // On vérifie que la commande est valide
            if (btnSource.CommandName == "demander" || btnSource.CommandName == "accepter")
            {
                // On récupère l'identifiant
                int idamis = -1;
                if (Int32.TryParse(btnSource.CommandArgument, out idamis))
                {
                    // On traite en fonction de la réponse
                    if (btnSource.CommandName == "accepter")
                    {
                        AmisService.confirmerDemande(idamis, utilisateur.idutilisateur);

                        // Après ajout on va sur la page du demandeur
                        Response.Redirect("Profil.aspx?id=" + idamis.ToString());
                    }
                    else if (btnSource.CommandName == "demander")
                    {
                        AmisService.demandeAmitie(utilisateur.idutilisateur, idamis);

                        // Après ajout on va sur la page du demandeur
                        Response.Redirect("Nouveau.aspx");
                    }

                    // On met à jour la liste des demandes
                    rafraichirDemandes();
                }
            }
        }


        /// <summary>
        /// Permet de comparer deux utilisateurs.
        /// </summary>
        private class CompatateurUtilisateur : IComparer<Utilisateur>, IEqualityComparer<Utilisateur>
        {

            // Egalitée
            public bool Equals(Utilisateur u1, Utilisateur u2)
            {
                return u1.idutilisateur == u2.idutilisateur;
            }

            // HashCode
            public int GetHashCode(Utilisateur u)
            {
                return u.idutilisateur.GetHashCode();
            }

            // Comparaison
            public int Compare(Utilisateur u1, Utilisateur u2)
            {
                if (u1.nom == u2.nom)
                    return u1.prenom.CompareTo(u2.prenom);
                else
                    return u1.nom.CompareTo(u2.nom);
            }
        }

    }
}